//
//  Common.h
//  LBBase
//
//  Created by Gary on 15/7/1.
//  Copyright (c) 2015年 Lebo. All rights reserved.
//

#ifndef Common_h
#define Common_h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "CommonDefine.h"
#import "CustomerAlert.h"

@interface Common : NSObject

//获取当前系统版本
+ (ESystemVersion)systemVersion;

//获取屏幕比例类型
+ (EScreenScaleType)screenScale;

//是否安装某个应用
+ (BOOL)isInstallApp:(NSString *)urlStr;

//打开应用
+ (void)openApp:(NSString *)urlStr;

//获取当前的视图控制器
+ (UIViewController*)currentViewController;

//根视图
+ (UIViewController*)rootViewController;
+ (void)setRootViewController:(UIViewController*)root;

//获取MainStoryBoard上的视图控制器
+ (UIViewController*)viewController:(NSString*)identifier;

+ (UIViewController*)viewController:(NSString*)identifier storyboard:(NSString*)storyboard;

//modal视图
+ (void)presentModalViewController:(UIViewController *)root animated:(BOOL)flag completion:(void (^)(void))completion;

//从info.plist中获得本地化的字符串
+ (NSString*)getLocalStr:(NSString*)key;

//获取纯色的图片
+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size;

//图片缩放
+ (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size;

//打印UIView的frame
+ (void)printFrame:(UIView*)view message:(NSString*)msg;

//开启网络状态变化检测，在block执行返回的处理
+ (void)networkReachabilityStartMonitoring:(void (^)(NSInteger status))block;

//根据输入的参数，转换成url的参数字符串
+ (NSString*)URLEncodedStringFromKeyAndValue:(NSString*)key value:(id)value;

//将字典的参数转换成字符串的数组，用以在post请求的url中
+ (NSArray*)queryStringPairsFromKeyAndValue:(NSString*)key value:(id)value;

//从url中获取参数
+ (NSDictionary*)parametersFromURLString:(NSString*)urlString;

//在一页中数据列表的行数
+ (NSInteger)dataListPageSize;

//在AppStore中下载润健
+ (void)downloadInAppStore:(const NSString*)appId;

//拨打服务电话
+ (void)callServicePhone;

#pragma mark - Html Text和Attribute String

//将HTML文字转换为NSMutableAttributedString
+ (NSMutableAttributedString*)attrStrFromHtmlText:(NSString*)htmlText;

//将HTML文字转换为NSAttributedString，自动添加了字体
+ (NSAttributedString*)attrStrFromHtmlText:(NSString *)htmlText font:(UIFont *)font;

//处理服务器返回的不规范的HTML字符串
+ (NSAttributedString *)getAttributedString:(NSString *)desString;

//去掉html文字中的标签，以及转义
+ (NSString *)textRemovedHtmlTag:(NSString *)htmlText;

#pragma mark - 日期，文字等格式化

//从字符串获取日期对象
+ (NSDate*)dateFromString:(NSString*)string;

//从指定格式的字符串获取日期对象
+ (NSDate*)dateFromString:(NSString*)string format:(NSString*)format;

//格式化时间
+ (NSString*)formatTimeString:(NSUInteger)hours minutes:(NSUInteger)minutes seconds:(NSUInteger)seconds;

//补足到十位数
+ (NSString*)fullDecimal:(NSUInteger)digital;

#pragma mark - 控件相关

//根据文字和字体提前获取label的大小，用于设定label的frame
+ (CGSize)fitSizeForText:(NSString*)text font:(UIFont*)font;
+ (CGSize)fitSizeForText:(NSString*)text font:(UIFont*)font maxWidth:(CGFloat)maxWidth;
+ (CGSize)fitSizeForText:(NSString*)text font:(UIFont*)font maxHight:(CGFloat)maxHeight;
+ (CGSize)fitSizeForText:(NSString*)text font:(UIFont*)font maxWidth:(CGFloat)maxWidth maxHight:(CGFloat)maxHeight;

#pragma mark - 文件系统相关

//将Resource目录下的内容复制到Documents目录下
+ (BOOL)copyResourceToDocumentsFolder:(NSString*)fileName;

//获取Resource目录下完整路径
+ (NSString*)getResourceFilePath:(NSString*)fileName;

//计算单个文件大小
+ (long long)fileSizeAtPath:(NSString*)filePath;

//计算文件夹的大小
+ (double)folderSizeAtPath:(NSString*)folderPath;

#pragma mark - 字符串判断

//对字符串去空白
+ (NSString*)trim:(NSString*)string;

//字符串是否为空
+ (BOOL)isEmptyString:(NSString*)string;

//md5加密
+ (NSString*)md5:(NSString*)string;

//正则表达式匹配
+ (BOOL)regexString:(NSString*)string match:(NSString*)match;

//判断字符串是否为中国手机号码
+ (BOOL)isChinaMobileNumber:(NSString *)string;

//判断登录用户名的合法性
+ (BOOL)isAccount:(NSString*)string;

//判断密码的合法性
+ (BOOL)isPassword:(NSString*)string;

//判断真实用户名的合法性，包括英文字和中文名
+ (BOOL)isRealName:(NSString*)string;

//判断身份证号码的合法性
+ (BOOL)isIDNumber:(NSString*)string;

//判断邮箱的合法性
+ (BOOL)isValidateEmail:(NSString *)string;

#pragma mark - 生产环境和测试环境的判断

+ (BOOL)isProductionEnv;

+ (void)updateProductionEnv:(BOOL)isProEnv;

+ (BOOL)isPaymentProductionEnv;

+ (void)updatePaymentProductionEnv:(BOOL)isProEnv;

#pragma mark - 获取和更新服务器url

+ (NSString*)baseServerURL;

+ (void)updateBaseServerURL:(NSString*)url save:(BOOL)save;

#pragma mark - 登录及当前用户信息相关

+ (void)loginWithCurrentUser;

+ (NSString*)currentDeivceToken;

+ (void)updateDeivceToken:(NSString*)str;

+ (NSString*)currentToken;

+ (void)updateToken:(NSString*)str;

+ (NSString*)currentUserID;

+ (void)updateUserID:(NSString*)str;

+ (NSDictionary*)currentUserInfo;

#pragma mark - Alert相关

+ (void)showLocalMessage:(NSString *)message;
+ (void)showLocalAlert:(NSString *)title message:(NSString *)message;
+ (void)showLocalAlert:(NSString *)title message:(NSString *)message delegate:(id<UIAlertViewDelegate>)delegate;

+ (void)showLocalAlert:(NSString *)title message:(NSString *)message tag:(NSInteger)tag;
+ (void)showLocalAlert:(NSString *)title message:(NSString *)message delegate:(id<UIAlertViewDelegate>)delegate tag:(NSInteger)tag;

+ (void)showMessage:(NSString *)message;
+ (void)showAlert:(NSString *)title message:(NSString *)message;
+ (void)showAlert:(NSString *)title message:(NSString *)message delegate:(id<UIAlertViewDelegate>)delegate tag:(NSInteger)tag;

/**
 *  自定弹出框
 *
 *  @param view   自定义视图
 *  @param height 视频的高度
 */
+ (void)showCustomerAlert:(UIView *)view;

/**
 *  自定弹出框
 *
 *  @param view   自定义视图
 *  @param height 视频的高度
 *  @param isShow 是否显示关闭按钮
 */
+ (void)showCustomerAlert:(UIView *)view showCloseButton:(BOOL)isShow;

/**
 *  消失自定义弹出框
 */
+ (void)hideCustomerAlert;

/**
 *  自定义弹出框最大宽度
 *
 *  @return 自定义弹出框最大宽度
 */
+ (CGFloat)customerAlertMaxWidth;

#pragma mark - Toast

+ (void)showLocalToast:(NSString *)localTitle;
+ (void)showToast:(NSString*)message;
+ (void)showToast:(NSString *)message inView:(UIView*)view;

#pragma mark - 对于网络返回的数据包做一般性的分析

//若返回数据过于复杂，或者结构特殊，需要在单独的manager中重新编写
+ (void)analyseNetworkResponseAndNotify:(id)data
                               moduleID:(NSInteger)moduleID
                              funIDSucc:(NSInteger)funIDSucc
                              funIDFail:(NSInteger)funIDFail;

+ (void)analyseNetworkResponseAndNotify:(id)data
                               moduleID:(NSInteger)moduleID
                              funIDSucc:(NSInteger)funIDSucc
                              funIDFail:(NSInteger)funIDFail
                                success:(void (^)(NSDictionary *dic))success
                                failure:(void (^)(NSDictionary *dic))failure;

/**
 *  针对数据返回非0的resultCode做common的处理，比如登录超时等
 *
 *  @param errorCode 错误码
 *
 *  @return YES：继续发送数据通知 NO：不往下发送数据，如登录超时后直接返回登录页面
 */
+ (BOOL)processByCommonErrorCode:(NSInteger)errorCode dic:(NSDictionary*)dic;

#pragma mark - 一般性列表刷新的规则

/**
 *  刷新列表
 *  调用该方法后，应调用停止列表header动画的方法并设置页数为初始值1
 *  如[tableView.header endRefreshing]
 *
 *  @param tableView    需要刷新数据的UITableView
 *  @param tableArray   全新的数据源
 *  @param updatedArray 新增的数据源
 */
+ (void)updateTableByNewData:(UITableView*)tableView
                  tableArray:(NSMutableArray*)tableArray
                updatedArray:(NSArray*)updatedArray;

/**
 *  列表加载更多
 *  调用该方法后，应调用停止列表footer动画的方法
 *  如[tableView.footer endRefreshing]
 *
 *  @param tableView    需要刷新数据的UITableView
 *  @param tableArray   列表的数据源
 *  @param updatedArray 新增的数据源
 *  @param uniqueKey    用来判断新旧数据源字典是否存在重复记录的键值
 *
 *  @return 新数据的记录数，若返回大于0，列表的页数应自增1，否则页数保持不变
 */
+ (NSInteger)updateTableByMoreData:(UITableView*)tableView
                        tableArray:(NSMutableArray*)tableArray
                      updatedArray:(NSArray*)updatedArray
                         uniqueKey:(NSString*)uniqueKey;

/**
 *  注销并返回登录窗口
 */
+ (UIViewController*)logoutToWindow;

#pragma mark - 导航栏相关

+ (NSMutableDictionary*)getNavigationBarBtnFullSetting;

+ (void)setNavigationBarBtn:(id)setting
                   inButton:(UIBarButtonItem*)inButton
                  outButton:(UIBarButtonItem**)outButton;

+ (NSDictionary*)setNavaigationBarBtnBgImages:(id)images;

#pragma mark - 计量单位

//年
+ (NSString*)yearUnit;

//万
+ (NSString*)tenThousandUnit;

//公里
+ (NSString*)kilometreUnit;

//里程，万公里
+ (NSString*)mileageUnit;

#pragma mark - 数额显示、金融支付等相关

//货币金额逗号输出
+ (NSString *)countNumAndChangeformat:(NSString *)num;

//以万为单位格式化输出
+ (NSString*)numberWithTenThousand:(float)number;

// 正常号转银行卡号 － 增加4位间的空格
+ (NSString*)normalNumToBankNum:(NSString*)normalNum;

// 银行卡号转正常号 － 去除4位间的空格
+ (NSString*)bankNumToNormalNum:(NSString*)bankNum;

#pragma mark - 中国省、市、区地理区域

+ (NSArray *)chinaRegion;

+ (NSArray *)getChindRegionIndexs:(NSArray *)regionArr
                            pName:(NSString *)pName
                            cName:(NSString *)cName
                            rName:(NSString *)rName;

+ (NSArray *)getChinaRegion:(NSArray *)chinaRegionArr
                     pIndex:(NSInteger)pIndex
                     cIndex:(NSInteger)cIndex
                     rIndex:(NSInteger)rIndex;

+ (NSString *)getChinaProvince:(NSArray *)regionArr index:(NSInteger)index;

+ (NSArray *)getChinaProvince:(NSArray *)regionArr pIndex:(NSInteger)pIndex cIndex:(NSInteger)cIndex;

+ (NSArray *)getChinaProvince:(NSArray *)chinaRegionArr
                       pIndex:(NSInteger)pIndex
                       cIndex:(NSInteger)cIndex
                       rIndex:(NSInteger)rIndex;

//16进制颜色值转换为COLOR
+(UIColor *)getColor:(NSString *)hexColor;
@end

#endif